import ResKeeper from "../res/ResKeeper";
import { uiManager } from "./UIManager"; 

/**
 * UIView界面基础类
 * 
 * 1. 快速关闭与屏蔽点击的选项配置
 * 2. 界面缓存设置（开启后界面关闭不会被释放，以便下次快速打开）
 * 3. 界面显示类型配置
 * 
 * 4. 加载资源接口（随界面释放自动释放），this.loadRes(xxx)
 * 5. 由UIManager释放
 * 
 * 5. 界面初始化回调（只调用一次）
 * 6. 界面打开回调（每次打开回调）
 * 7. 界面打开动画播放结束回调（动画播放完回调）
 * 8. 界面关闭回调
 * 9. 界面置顶回调
 * 
 * 2018-8-28 by 宝爷
 */

const { ccclass, property } = cc._decorator;

/** 界面展示类型 */
export enum UIShowTypes {
    UIFullScreen,       // 全屏显示，全屏界面使用该选项可获得更高性能
    UIAddition,         // 叠加显示，性能较差
    UISingle,           // 单界面显示，只显示当前界面和背景界面，性能较好
};

@ccclass
export class UIView extends ResKeeper {

    @property(cc.Node)
    background:cc.Node= null;
    @property(cc.Node)
    main:cc.Node = null;
    /** 用于拦截点击的节点 */
    private blocker: cc.Node = null;

    protected animTime:number = 0.3;


    /** 快速关闭 */
    @property()
    quickClose: boolean = false;
    /** 屏蔽点击选项 在UIConf设置屏蔽点击*/
    // @property
    // preventTouch: boolean = true;
    /** 缓存选项 */
    @property()
    cache: boolean = false;
    /** 界面显示类型 */
    @property({ type: cc.Enum(UIShowTypes) })
    showType: UIShowTypes = UIShowTypes.UISingle;

    @property()
    autoAdpter:boolean = true;


    /** 界面id */
    public UIid: number = 0;
 
    /********************** UI的回调 ***********************/
    /**
     * 当界面被创建时回调，生命周期内只调用
     * @param args 可变参数
     */
    public init(...args): void {

    }



    onOpenAni(cb:Function){
        this.background.opacity = 0;
        this.background.active = true; 
        this.main.scale = 0;
        this.main.active = true;
        this.node.active = true;
    
        // 播放背景动画
        cc.tween(this.background)
            .to(this.animTime * 0.8, { opacity: 200 })
            .start();
        // 播放主体动画
        cc.tween(this.main)
            .to(this.animTime, { scale: 1 }, { easing: 'backOut' })
            .call(() => {
                // 弹窗已完全展示（动画完毕）
                cb && cb();
            })
            .start();
    }


    onCloseAni(cb:Function,isAnim:boolean = true){
        if (!this.blocker) {
            this.blocker = new cc.Node('blocker');
            this.blocker.addComponent(cc.BlockInputEvents);
            this.blocker.setParent(this.node);
            this.blocker.setContentSize(this.node.getContentSize());
        }
        this.blocker.active = true;
        if (isAnim) {
            // 播放背景动画
            cc.tween(this.background)
                .delay(this.animTime * 0.2)
                .to(this.animTime * 0.8, { opacity: 0 })
                .call(() => {
                    this.background.active = false;
                })
                .start();
            // 播放主体动画
            cc.tween(this.main)
                .to(this.animTime, { scale: 0 }, { easing: 'backIn' })
                .call(() => {
                    // 取消拦截
                    this.blocker.active = false;
                    // 关闭节点
                    this.main.active = false;
                    this.node.active = false;
                    // 弹窗已完全隐藏（动画完毕）
                    cb && cb(); 
                })
                .start();
        }else{
            this.blocker.active = false;
            // 关闭节点
            this.main.active = false;
            this.node.active = false; 
            // 弹窗完成回调（该回调为 PopupManager 专用）
            // 注意：重写 hide 函数时记得调用该回调
            cb && cb(); 
        }
    }



    /**
     * 当界面被打开时回调，每次调用Open时回调
     * @param fromUI 从哪个UI打开的
     * @param args 可变参数
     */
    public onOpen(fromUI: number, ...args): void {
        
    }
 
    /**
     * 按规则 自动适配 和 自动绑定关闭按钮
     * @param fromUI 从哪个UI打开的
     * @param args 可变参数
     */
     public bind(fromUI: number, ...args): void {
        //自动适配
        
    }

    /**
     * 每次界面Open动画播放完毕时回调
     */
    public onOpenAniOver(): void {

    }

    /**
     * 当界面被关闭时回调，每次调用Close时回调
     * 返回值会传递给下一个界面
     */
     public onClose(): any {

    }

    /**
     * 当界面被置顶时回调，Open时并不会回调该函数
     * @param preID 前一个ui
     * @param args 可变参数，
     */
    public onTop(preID: number, ...args): void {

    }
 
    public close(){
        uiManager.close(this);        
    }

}
